hhkb
Python

파이썬기초_03_메모리 관리와 가비지 컬렉션

작성자 : Heehyeon Yoo|2025-12-17
# Python# Memory# GC# 가비지 컬렉션# Reference Counting

1. 파이썬의 메모리 관리 전략

파이썬은 개발자가 직접 메모리를 할당/해제하지 않는다. (C/C++의 malloc/free 없음)
대신 두 가지 방식을 혼합하여 자동으로 관리한다.

  1. 레퍼런스 카운팅 (Reference Counting): 주된 방식 (가장 기본)
  2. 가비지 컬렉션 (Garbage Collection): 보조 방식 (순환 참조 해결용)

2. 레퍼런스 카운팅 (Reference Counting)

  • 작동 원리:
    • 모든 객체는 자신이 '몇 번 참조되고 있는지' 숫자를 가지고 있음 (ob_refcnt).
    • 이 숫자가 0이 되는 즉시 메모리에서 삭제됨.
  • 장점:
    • 메모리 해제 시점이 정확함 (사용 끝나자마자 바로 삭제).
    • 실시간성이 보장됨.
  • 단점:
    • 순환 참조 (Cyclic Reference) 문제를 해결하지 못함.
    • 예: A가 B를 잡고, B가 A를 잡고 있으면, 둘 다 안 쓰는데도 카운트가 1이라서 영원히 안 지워짐.

3. 세대별 가비지 컬렉션 (Generational Garbage Collection)

레퍼런스 카운팅의 한계(순환 참조)를 해결하기 위해 존재하는 청소부.

  • 가설 (Generational Hypothesis):
    • "대부분의 객체는 금방 죽는다(쓸모없어진다)."
    • "오래 살아남은 객체는 계속 오래 살 것이다."
  • 작동 방식 (0세대 ~ 2세대):
    1. 모든 객체는 처음에 0세대로 태어남.
    2. 파이썬이 주기적으로 0세대 객체들을 검사(Sweeping/Collection).
    3. 여기서 살아남은 놈들은 1세대로 승격.
    4. 또 살아남으면 2세대로 승격.
    5. 세대가 높을수록(2세대) 검사를 덜 자주 함. (어차피 안 죽을 놈들이니까 검사 비용 아끼려고)

4. 순환 참조와 weakref

  • 순환 참조 문제:
    • gc 모듈이 해결해주긴 하지만, GC가 돌기 전까지는 메모리를 차지하고 있음. (비효율)
  • 해결책 (weakref):
    • 약한 참조 (Weak Reference): 객체를 참조하긴 하되, 레퍼런스 카운트를 증가시키지 않음.
    • 캐싱(Caching) 구현이나 상호 참조가 필요할 때 필수적으로 사용.
import weakref

class A: pass

a = A()
r = weakref.ref(a) # 참조 카운트 안 올라감

print(r()) # 객체 접근 가능
del a      # 원본 삭제됨
print(r()) # None (접근 불가, 자동으로 연결 끊김)